﻿Imports Commander_Wars.Spieletools
<Serializable()> Public MustInherit Class ObjektGebäude
    Implements ICloneable
#Region "Variablen"
    Private Spielern As Integer
    Public Property Spieler() As Integer
        Get
            Return Spielern
        End Get
        Set(ByVal value As Integer)
            Spielern = value
        End Set
    End Property
    <NonSerialized()> Private BildIDD As Integer
    Public Property BildID() As Integer
        Get
            Return BildIDD
        End Get
        Set(ByVal value As Integer)
            BildIDD = value
        End Set
    End Property
    <NonSerialized()> Private Frames As Integer
    Public Property Frame() As Integer
        Get
            If Frames > 1 Then
                Return 1
            Else
                Return 0
            End If
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > 3 Then
                Frames = 0
            End If
        End Set
    End Property
    Private GebäudeIDD As String
    Public Property GebäudeID() As String
        Get
            If GebäudeIDD = "VERWEIS" Then
                If IsNothing(Objektverwalter.Spielfeld) = False Then
                    If Hauptmenü.Pause = False Then
                        Return Objektverwalter.Spielfeld.Landschaften(Rechteck.X, Rechteck.Y, Me.Schlacht).Gebäude.GebäudeIDD
                    ElseIf Objektverwalter.Spielfeld.Landschaften(Rechteck.X, Rechteck.Y, Me.Schlacht).Gebäude Is Nothing Then
                        Return GebäudeIDD
                    Else
                        Return Objektverwalter.Spielfeld.Landschaften(Rechteck.X, Rechteck.Y, Me.Schlacht).Gebäude.GebäudeIDD
                    End If
                Else
                    Return GebäudeIDD
                End If
            Else
                Return GebäudeIDD
            End If
        End Get
        Set(ByVal value As String)
            GebäudeIDD = value
        End Set
    End Property
    <NonSerialized()> Private Gebäudenamen As String
    Public Property Gebäudename() As String
        Get
            If GebäudeIDD = "VERWEIS" Then
                Return Objektverwalter.Spielfeld.Landschaften(Rechteck.X, Rechteck.Y, Me.Schlacht).Gebäude.Gebäudename
            Else
                Return Gebäudenamen
            End If
        End Get
        Set(ByVal value As String)
            Gebäudenamen = value
        End Set
    End Property
    Public Const Besetzungszahl As Byte = 20
    Protected Bestzunge As Integer = -1
    Public Property Besetzung() As Integer
        Get
            Return Bestzunge
        End Get
        Set(ByVal value As Integer)
            If Not Angriff = Angriffe.Silo Then
                If GebäudeIDD <> "RAKETENSILO" Then
                    Bestzunge = value
                End If
            End If
        End Set
    End Property
    Public Function Besetzen(ByVal Einheit As ObjektEinheit) As Boolean
        If Bestzunge > 0 Then
            Objektverwalter.Spielfeld.AktuelleEinheit.Besetzen = True
            If My.Settings.BesetzungsAnimation = True And Not Hauptmenü.Aufzeichnungsspulen Then
                Objektverwalter.NeuObjektAnimation(New Point(Rechteck.X, Rechteck.Y), "BESETZEN", ObjektSpielfeld.TopLayer)
            Else
                Dim Änderung As Integer = Einheit.getKP + Einheit.BesetzungsBonus
                Dim Bonus As Single = 0
                If Einheit.GetSpieler.KOS(0).IsInKOZone(Einheit) Then
                    Bonus = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).Besetzer
                End If
                If Not Bonus = 0 Then
                    Dim Bonus2 As Single = Math.Round(Bonus)
                    'Wir schaue ob Addiert oder multipliziert werden soll
                    If Bonus2 = Bonus Then
                        Änderung += Bonus
                    Else
                        Änderung *= Bonus
                    End If
                End If
                Dim Bonussenkung As Integer = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GetBonusgebäude(Rechteck.X, Rechteck.Y)
                If Bonussenkung >= 0 Then
                    Änderung -= Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BonusGebäude(Bonussenkung).Z
                    Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).RemoveBonusGebäude(Bonussenkung)
                End If
                Besetzung -= Änderung
                If Besetzung <= 0 Then
                    Objektverwalter.Spielfeld.AktuelleEinheit.Besetzen = False
                    Bestzunge = Besetzungszahl
                    Select Case Angriff
                        Case Angriffe.Sendeturm
                            Objektverwalter.Spielfeld.Spieler(Spieler).Sendetürme -= 1
                            Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Sendetürme += 1
                        Case Angriffe.Mine
                            Objektverwalter.Spielfeld.Spieler(Spieler).Minen -= 1
                            Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Minen += 1
                        Case Angriffe.HQ
                            If Spieler > 0 Then
                                Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQVerlust)
                            End If
                            Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Einheit.Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQEroberung)
                    End Select
                    If getFonds = True Then
                        Objektverwalter.Spielfeld.Spieler(Spieler).Geldgebäude -= 1
                        Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Geldgebäude += 1
                    End If
                    Objektverwalter.Spielfeld.Regeln.CheckSieg()

                    Spieler = Einheit.Spieler
                    getBildID(Nothing)
                    Return True
                Else
                    Return False
                End If
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Erobert.wav", False)
            End If
        End If
        Return False
    End Function
    Private getFond As Boolean = False
    Public Property getFonds() As Boolean
        Get
            Return getFond
        End Get
        Set(ByVal value As Boolean)
            getFond = value
        End Set
    End Property
    Public Overridable Function GetBauliste() As String()
        Return New String() {}
    End Function
    Public Function GetBauliste(ByVal Spieler As Integer) As String()
        Dim S As New Stack(Of String)
        Dim S1() As String = GetBauliste()
        For Each Unit In S1
            If Spieler > 0 Then
                If Objektverwalter.Spielfeld.Spieler(Spieler).SpielerBaublockade IsNot Nothing Then
                    If Objektverwalter.Spielfeld.Spieler(Spieler).SpielerBaublockade.CanBuildUnit(Unit) Then
                        If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(Unit) >= 0 Then
                            S.Push(Unit)
                        End If
                    End If
                Else
                    If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(Unit) >= 0 Then
                        S.Push(Unit)
                    End If
                End If
            Else
                S.Push(Unit)
            End If
        Next
        Array.Resize(S1, S.Count)
        For I = 0 To S1.Length - 1
            S1(I) = S(S.Count - I - 1)
        Next
        Return S1
    End Function
    Public Function GetBaulisteThisPlayer() As String()
        Dim S As New Stack(Of String)
        Dim S1() As String = GetBauliste()
        For Each Unit In S1
            If Spieler > 0 Then
                If Objektverwalter.Spielfeld.Spieler(Spieler).SpielerBaublockade IsNot Nothing Then
                    If Objektverwalter.Spielfeld.Spieler(Spieler).SpielerBaublockade.CanBuildUnit(Unit) Then
                        If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(Unit) >= 0 Then
                            S.Push(Unit)
                        End If
                    End If
                Else
                    If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(Unit) >= 0 Then
                        S.Push(Unit)
                    End If
                End If
            Else
                S.Push(Unit)
            End If
        Next
        Array.Resize(S1, S.Count)
        For I = 0 To S1.Length - 1
            S1(I) = S(S.Count - I - 1)
        Next
        Return S1
    End Function
    Dim LebenMax As Integer
    Protected Leben As Integer
    Public Property KP() As Integer
        Get
            If GebäudeIDD = "VERWEIS" Then
                Return Objektverwalter.Spielfeld.Landschaften(Rechteck.X, Rechteck.Y, Schlacht).Gebäude.KP
            Else
                Return Leben
            End If
        End Get
        Set(ByVal value As Integer)
            Leben = value
        End Set
    End Property
    Private Deckunge As Integer
    Public Property Deckung() As Integer
        Get
            Return Deckunge
        End Get
        Set(ByVal value As Integer)
            Deckunge = value
        End Set
    End Property
    <NonSerialized()> Private Schade As Integer = 0
    Public Property Schaden() As Integer
        Get
            If Schade > 0 Then
                Return Schade + Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).GebäudeZusatzSchaden
            ElseIf Schade < 0 Then
                Return Schade - Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).GebäudeZusatzSchaden
            Else
                Return Schade
            End If
        End Get
        Set(ByVal value As Integer)
            Schade = value
        End Set
    End Property
    <NonSerialized()> Private Angrifn As Angriffe = Angriffe.Keiner
    Public Property Angriff() As Angriffe
        Get
            Return Angrifn
        End Get
        Set(ByVal value As Angriffe)
            Angrifn = value
        End Set
    End Property
    Enum Angriffe
        Keiner
        Kreis
        Strahl
        SchussN
        SchussO
        SchussS
        SchussW
        DreiStrahlN
        DreiStrahlO
        DreiStrahlS
        DreiStrahlW
        FabrikBauen
        Silo
        Rakete
        Sendeturm
        HQ
        Vulkan
        Mine
        ''' <summary>
        ''' Der Angriff der fliegenden Festung
        ''' </summary>
        ''' <remarks></remarks>
        KugelKreis
        ''' <summary>
        ''' Meint das wir einen Sichtbonus im Kriegsnebel bekommen.
        ''' </summary>
        ''' <remarks></remarks>
        Radar
        ''' <summary>
        ''' Heißt kann keine Truppen bauen! LOL
        ''' </summary>
        ''' <remarks></remarks>
        Temporär
    End Enum
    <NonSerialized()> Private Reichweiten As Integer = -1
    Public Property Reichweite() As Integer
        Get
            Return Reichweiten
        End Get
        Set(ByVal value As Integer)
            Reichweiten = value
        End Set
    End Property
    <NonSerialized()> Public Rechteck As Rectangle
    <NonSerialized()> Public RotationsZenturm As Point
    <NonSerialized()> Public Feuerladung As Integer
    <NonSerialized()> Protected Schlacht As Integer
    Protected Feuerbereite As Integer
    ''' <summary>
    '''  Negative Werte setzen die Zahl auf das Maximum
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Feuerbereit() As Integer
        Get
            Return Feuerbereite
        End Get
        Set(ByVal value As Integer)
            If value < 0 Then
                Feuerbereite = Feuerladung
            Else
                Feuerbereite -= value
            End If
            If Feuerbereite < 0 And Feuerladung > 0 Then
                Feuerbereite = 0
            End If
        End Set
    End Property
    Public Sub SetFeuerbereit(ByVal Feuerbereit As Integer)
        Feuerbereite = Feuerbereit
    End Sub
    Public WirdZu As String = ""
    Public Verweisgebäude(,) As Integer = {}

    Protected Verfonds As Boolean = False
    Public Property Versorung() As Boolean
        Get
            Return Verfonds
        End Get
        Set(ByVal value As Boolean)
            Verfonds = value
        End Set
    End Property
    <Serializable()> Structure Variable
        Implements ICloneable
        Public Sub New(ByVal Name As String, ByVal Wert As Integer)
            Namen = Name
            Werte = Wert
        End Sub
        Private Namen As String
        Public Property Name() As String
            Get
                Return Namen
            End Get
            Set(ByVal value As String)
                Namen = value
            End Set
        End Property
        Private Werte As Integer
        Public Property Wert() As Integer
            Get
                Return Werte
            End Get
            Set(ByVal value As Integer)
                Werte = value
            End Set
        End Property
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return MemberwiseClone()
        End Function
    End Structure
    Public Variablen As Variable() = {}
    ''' <summary>
    ''' Wenn wir das für die KI hier abspeichern, ist sie schneller
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public CanMoveAfterBuilding As List(Of Variable)
#End Region


    Public Sub New(ByVal neuGebäudeID As String, ByVal neuSpieler As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Schlacht As Integer)
        Rechteck.X = neuX
        Rechteck.Y = neuY
        Spieler = neuSpieler
        GebäudeID = neuGebäudeID
        Me.Schlacht = Schlacht
    End Sub
    Public Sub New(ByVal neuGebäudeID As String, ByVal neuSpieler As Integer, ByVal neuLeben As Integer, ByVal neuBesetzungszahl As Integer, ByVal neuX As Integer, ByVal neuY As Integer, ByVal Feuerzahl As Integer, ByVal Schlacht As Integer)
        Rechteck.X = neuX
        Rechteck.Y = neuY
        Spieler = neuSpieler
        GebäudeID = neuGebäudeID
        Bestzunge = neuBesetzungszahl
        Me.Feuerbereite = Feuerzahl
        Me.Schlacht = Schlacht
    End Sub



    Public Sub getBildID(ByVal Spielfeld As ObjektSpielfeld)
        BildIDD = -1
        If Spielfeld Is Nothing Then
            If Not Objektverwalter.Spielfeld Is Nothing Then
                If Rechteck.Width = Hauptmenü.Feldbreite And Rechteck.Height = Hauptmenü.Feldbreite * 2 Then
                    For I = 0 To Objektverwalter.AlleGebäude.Length - 1
                        If Objektverwalter.AlleGebäude(I).GebäudeID = GebäudeID Then
                            BildID = I
                            Exit For
                        End If
                    Next
                Else
                    For I = 0 To Objektverwalter.AlleGebäude.Length - 1
                        If Objektverwalter.AlleGebäude(I).GebäudeID = GebäudeID Then
                            BildID = I
                            Exit For
                        End If
                    Next
                End If
            Else
                BildIDD = -1
            End If
        Else
            For I = 0 To Objektverwalter.AlleGebäude.Length - 1
                If Objektverwalter.AlleGebäude(I).GebäudeID = GebäudeID Then
                    BildID = I
                    Exit For
                End If
            Next
        End If
        Frames = Zufallszahl(0, 3)
    End Sub
    Public MustOverride Function GetLandschaftsuntergrund() As String()
    Public MustOverride Sub DOSpielFrame()
    Public MustOverride Function GetAngriffsFelder() As Point()
    Public Sub Malen(ByVal Kriegsnebel As Nebelarten, ByVal Alpha As Integer, ByVal KooX As Integer, ByVal KooY As Integer)
        If My.Settings.draw3D Then
            If GebäudeIDD = "VERWEIS" Then
                Exit Sub
            End If
            ObjektLadeklasse.Gebäude3D.Malen(GebäudeID, KooX, KooY, Schlacht, Spieler)
        Else

            If BildID >= 0 Then
                If GebäudeIDD = "VERWEIS" Then
                    BildIDD = -1
                    Exit Sub
                End If
                Dim sngRotation As Double = 0
                Dim intColor As Color = Color.FromArgb(Alpha, 255, 255, 255)
                Select Case Kriegsnebel
                    Case Nebelarten.Kriegsnebel
                        intColor = Color.FromArgb(Alpha, 120, 120, 120)
                    Case Else
                        intColor = Color.FromArgb(Alpha, 255, 255, 255)
                End Select
                'prüfen ob wir aus den Screenbereich laufen

                'Festlegen welchen Bereich vom Bitmap wir kopieren

                'Welcher Teil der Textur soll gemalt werden Nichts bedeutet gesamtes Bild

                With Grafikengine.recBild
                    .X = Frame * Rechteck.Width : .Width = Rechteck.Width
                    .Y = 0 : .Height = Rechteck.Height
                End With
                With Grafikengine.szfScale
                    .Height = Rechteck.Height
                    .Width = Rechteck.Width
                End With
                Grafikengine.ptfRotCenter = RotationsZenturm
                If Kriegsnebel = Nebelarten.Kriegsnebel Then
                    'Wir sehen alles Neutral
                    If Rechteck.Width = Hauptmenü.Feldbreite And Rechteck.Height = Hauptmenü.Feldbreite * 2 Then
                        Grafikengine.ptfPosition = New Point(Rechteck.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Rechteck.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY - Rechteck.Height / 4)
                        Objektverwalter.AlleGebäude(BildID).DrawGebäude(0, GetSpieler.Armee, intColor, sngRotation)
                    Else
                        Grafikengine.ptfPosition = New Point(Rechteck.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Rechteck.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY)
                        Objektverwalter.AlleGebäude(BildID).DrawGebäude(0, GetSpieler.Armee, intColor, sngRotation)
                    End If
                Else
                    If Rechteck.Width = Hauptmenü.Feldbreite And Rechteck.Height = Hauptmenü.Feldbreite * 2 Then
                        Grafikengine.ptfPosition = New Point(Rechteck.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Rechteck.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY - Rechteck.Height / 4)
                        Objektverwalter.AlleGebäude(BildID).DrawGebäude(Spieler, GetSpieler.Armee, intColor, sngRotation)
                    Else
                        Grafikengine.ptfPosition = New Point(Rechteck.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, Rechteck.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY)
                        Objektverwalter.AlleGebäude(BildID).DrawGebäude(Spieler, GetSpieler.Armee, intColor, sngRotation)
                    End If
                End If

            End If
        End If
    End Sub
    ''' <summary>
    ''' Sucht die ID im angegebenen Array
    ''' </summary>
    ''' <param name="Spezialgebäude"></param>
    ''' <param name="GebäudeID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function FindSpezialGebäudeID(ByVal Spezialgebäude() As ObjektSpieler.SpezialGebäude, ByVal GebäudeID As String)
        For I = 0 To Spezialgebäude.Length - 1
            If Spezialgebäude(I).GebäudeID = GebäudeID Then
                Return I
            End If
        Next
        Return -1
    End Function

    ''' <summary>
    ''' Mal sehen welche Anti-Luftwaffe wir bauen können.
    ''' </summary>
    ''' <param name="Prüffonds"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetProduceableAntiAirUnits(ByVal Prüffonds As Integer) As ObjektEinheit()
        Dim Units() As ObjektEinheit = {}
        Dim BListe As String() = GetBaulisteThisPlayer()
        For I = 0 To BListe.Length - 1
            Dim E As ObjektEinheit = ObjektLadeklasse.NewEinheit(BListe(I), Spieler, Rechteck.X, Rechteck.Y)
            If E.CanAttackAirUnits Then
                If CanBuildUnit(E, Prüffonds) Then
                    Array.Resize(Units, Units.Length + 1)
                    Units(Units.Length - 1) = E
                End If
            End If
        Next
        Return Units
    End Function
    ''' <summary>
    ''' Überprüft ob eine Einheit gebaut werden kann.
    ''' </summary>
    ''' <param name="Einheit"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CanBuildUnit(ByVal Einheit As ObjektEinheit) As Boolean
        Return CanBuildUnit(Einheit.EinheitenID)
    End Function
    ''' <summary>
    ''' Überprüft ob eine Einheit gebaut werden kann.
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CanBuildUnit(ByVal EinheitenID As String) As Boolean
        If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
            If Objektverwalter.Spielfeld.Spieler(Spieler).Fonds >= ObjektLadeklasse.GetEinheitenkosten(EinheitenID) * Objektverwalter.Spielfeld.Spieler(Spieler).Teurungsrate(EinheitenID, Rechteck.X, Rechteck.Y) Then
                If GetBaulisteThisPlayer.Contains(EinheitenID) Then
                    If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste Is Nothing Then
                        Return True
                    ElseIf Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(EinheitenID) >= 0 Then
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    ''' <summary>
    ''' Überprüft welche Einheiten theoretisch gebaut werden können wenn man soviel Fonds hätte
    ''' </summary>
    ''' <param name="Prüffonds"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CanBuildUnit(ByVal Einheit As ObjektEinheit, ByVal Prüffonds As Integer) As Boolean
        Return CanBuildUnit(Einheit.EinheitenID, Prüffonds)
    End Function
    ''' <summary>
    ''' Überprüft welche Einheiten theoretisch gebaut werden können wenn man soviel Fonds hätte
    ''' </summary>
    ''' <param name="EinheitenID"></param>
    ''' <param name="Prüffonds"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CanBuildUnit(ByVal EinheitenID As String, ByVal Prüffonds As Integer) As Boolean
        If Objektverwalter.Spielfeld.Einheiten(Rechteck.X, Rechteck.Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
            If Prüffonds >= ObjektLadeklasse.GetEinheitenkosten(EinheitenID) * Objektverwalter.Spielfeld.Spieler(Spieler).Teurungsrate(EinheitenID, Rechteck.X, Rechteck.Y) Then
                If GetBaulisteThisPlayer.Contains(EinheitenID) Then
                    If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste Is Nothing Then
                        Return True
                    ElseIf Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.GetWert(EinheitenID) >= 0 Then
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    ''' <summary>
    ''' Gibt zurück ob Infis mit diesem Gebäude etwas tun können.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function IsBesetzung(ByVal Einheit As ObjektEinheit) As Boolean
        Return IsBesetzung(Einheit.Spieler)
    End Function
    ''' <summary>
    ''' Gibt zurück ob Infis mit diesem Gebäude etwas tun können.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function IsBesetzung(ByVal Spieler As Integer) As Boolean
        If Besetzung > 0 Or Angriff = Angriffe.Silo Then
            If Objektverwalter.Spielfeld.Spieler(Me.Spieler).Team <> Objektverwalter.Spielfeld.Spieler(Spieler).Team Then
                Return True
            Else
                Return False
            End If
        ElseIf Angriff = Angriffe.Silo Then
            Return True
        Else
            Return False
        End If
    End Function
#Region "Feuerradius Anzeigen"
    Public MustOverride Sub FeuerradiusAnzeigen()
    Protected Sub KreisAnzeigen(Optional ByVal Farbe As String = "Grün")
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    If Rechteck.X - Reichweite + X >= 0 And Rechteck.X - Reichweite + X < Objektverwalter.Spielfeld.Breite And Rechteck.Y - Reichweite + Y >= 0 And Rechteck.Y - Reichweite + Y < Objektverwalter.Spielfeld.Höhe Then
                        Objektverwalter.neuMarkiertesFeld(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, Color.FromArgb(160, 255, 255, 255), Farbe)
                    End If
                End If
            Next
        Next
    End Sub
    Protected Function GetKreisFelder() As Point()
        Dim Felder As New Stack(Of Point)
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Dim Punkt As New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
                    If Punkt.X >= 0 And Punkt.X < Objektverwalter.Spielfeld.Breite And Punkt.Y >= 0 And Punkt.Y < Objektverwalter.Spielfeld.Höhe Then
                        Felder.Push(Punkt)
                    End If
                End If
            Next
        Next
        Return Felder.ToArray
    End Function
    ''' <summary>
    ''' Gibt alle Ziele zurück auf denen eine Einheit steht die getroffen werden kann.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function KreisZiele() As Point()
        Dim Punkte As Point() = {}
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    If Rechteck.X - Reichweite + X >= 0 And Rechteck.X - Reichweite + X < Objektverwalter.Spielfeld.Breite And Rechteck.Y - Reichweite + Y >= 0 And Rechteck.Y - Reichweite + Y < Objektverwalter.Spielfeld.Höhe Then
                        If Not Objektverwalter.Spielfeld.Einheiten(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                            If Schaden > 0 Then
                                If Not Objektverwalter.Spielfeld.Spieler(Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team Then
                                    Array.Resize(Punkte, Punkte.Length + 1)
                                    Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
                                End If
                            Else
                                If Spieler = Objektverwalter.Spielfeld.Einheiten(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler Then
                                    Array.Resize(Punkte, Punkte.Length + 1)
                                    Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
                                End If
                            End If
                        End If
                    End If
                End If
            Next
        Next
        Return Punkte
    End Function
    Protected Sub Geschützfeuermarkieren()
        Dim X As Integer = 1
        Dim XOrt As Integer = 0
        Dim YOrt As Integer = 0
        Select Case Angrifn
            Case Angriffe.SchussS
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt += 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussN
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt -= 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussW
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X - I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 -= 1
                        End If
                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussO
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X + I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 += 1
                        End If
                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
        End Select
    End Sub
    Protected Function GetGeschützfeuer() As Point()
        Dim Felder As New Stack(Of Point)
        Dim X As Integer = 1
        Dim XOrt As Integer = 0
        Dim YOrt As Integer = 0
        Select Case Angrifn
            Case Angriffe.SchussS
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt += 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        Dim P As New Point(Xort2, YOrt)
                        If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                            Felder.Push(P)
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussN
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt -= 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        Dim P As New Point(Xort2, YOrt)
                        If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                            Felder.Push(P)
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussW
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X - I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 -= 1
                        End If
                        Dim P As New Point(Xort2, YOrt)
                        If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                            Felder.Push(P)
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussO
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X + I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 += 1
                        End If
                        Dim P As New Point(Xort2, YOrt)
                        If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                            Felder.Push(P)
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
        End Select
        Return Felder.ToArray
    End Function
    ''' <summary>
    ''' Gibt alle Ziele von Geschützen zurück.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GeschützZiele() As Point()
        Dim Punkte() As Point = {}
        Dim X As Integer = 1
        Dim XOrt As Integer = 0
        Dim YOrt As Integer = 0
        Select Case Angrifn
            Case Angriffe.SchussS
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt += 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Schaden > 0 Then
                                        If Not Objektverwalter.Spielfeld.Spieler(Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    Else
                                        If Spieler = Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussN
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt -= 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Schaden > 0 Then
                                        If Not Objektverwalter.Spielfeld.Spieler(Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    Else
                                        If Spieler = Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussW
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X - I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 -= 1
                        End If
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Schaden > 0 Then
                                        If Not Objektverwalter.Spielfeld.Spieler(Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    Else
                                        If Spieler = Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussO
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X + I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 += 1
                        End If
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Schaden > 0 Then
                                        If Not Objektverwalter.Spielfeld.Spieler(Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    Else
                                        If Spieler = Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler Then
                                            Array.Resize(Punkte, Punkte.Length + 1)
                                            Punkte(Punkte.Length - 1) = New Point(Xort2, YOrt)
                                        End If
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
        End Select
        Return Punkte
    End Function
    Protected Sub StrahlFeuerAnzeigen()
        For I As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X - I
            Dim Y As Integer = Rechteck.Y
            Objektverwalter.neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255), "Rot")
        Next
        'Nach links markieren
        For I2 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X + I2
            Dim Y As Integer = Rechteck.Y
            Objektverwalter.neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255), "Rot")
        Next
        'Nach oben markieren
        For I3 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y - I3
            Objektverwalter.neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255), "Rot")
        Next
        'Nach unten markiern
        For I4 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y + I4
            Objektverwalter.neuMarkiertesFeld(X, Y, Color.FromArgb(160, 255, 255, 255), "Rot")
        Next
    End Sub
    Protected Function GetStrahlFeuerFelder() As Point()
        Dim Felder As New Stack(Of Point)
        For I As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X - I
            Dim Y As Integer = Rechteck.Y
            Dim P As New Point(X, Y)
            If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                Felder.Push(P)
            End If
        Next
        'Nach links markieren
        For I2 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X + I2
            Dim Y As Integer = Rechteck.Y
            Dim P As New Point(X, Y)
            If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                Felder.Push(P)
            End If
        Next
        'Nach oben markieren
        For I3 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y - I3
            Dim P As New Point(X, Y)
            If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                Felder.Push(P)
            End If
        Next
        'Nach unten markiern
        For I4 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y + I4
            Dim P As New Point(X, Y)
            If P.X >= 0 And P.X < Objektverwalter.Spielfeld.Breite And P.Y >= 0 And P.Y < Objektverwalter.Spielfeld.Höhe Then
                Felder.Push(P)
            End If
        Next
        Return Felder.ToArray
    End Function
    ''' <summary>
    ''' Gibt alle zu treffenden Einheiten zurück.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function StrahlZieleZurückgeben() As Point()
        Dim Punkte As Point() = {}
        'Nach Rechts markieren
        For I As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X - I
            Dim Y As Integer = Rechteck.Y
            If Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                Array.Resize(Punkte, Punkte.Length + 1)
                Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
            End If
        Next
        'Nach links markieren
        For I2 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X + I2
            Dim Y As Integer = Rechteck.Y
            If Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                Array.Resize(Punkte, Punkte.Length + 1)
                Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
            End If
        Next
        'Nach oben markieren
        For I3 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y - I3
            If Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                Array.Resize(Punkte, Punkte.Length + 1)
                Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
            End If
        Next
        'Nach unten markiern
        For I4 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y + I4
            If Not Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) Is Nothing Then
                Array.Resize(Punkte, Punkte.Length + 1)
                Punkte(Punkte.Length - 1) = New Point(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
            End If
        Next
        Return Punkte
    End Function
    Public MustOverride Sub Feuer(ByVal X As Integer, ByVal Y As Integer)
    Public Sub FeuerSchussMarkieren()
        Dim X As Integer = 1
        Dim XOrt As Integer = 0
        Dim YOrt As Integer = 0
        Select Case Angrifn
            Case Angriffe.SchussS
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt += 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussN
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -I + Rechteck.Y
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            YOrt -= 1
                        End If
                        Dim Xort2 As Integer = Rechteck.X + XOrt
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussW
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X - I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 -= 1
                        End If
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
            Case Angriffe.SchussO
                For I As Integer = 1 To Reichweite
                    For I2 As Integer = 1 To X
                        YOrt = -XOrt + Rechteck.Y
                        Dim Xort2 As Integer = Rechteck.X + I
                        If Rechteck.Height = Hauptmenü.Feldbreite * 3 Then
                            Xort2 += 1
                        End If
                        If Xort2 >= 0 And YOrt >= 0 And YOrt < Objektverwalter.Spielfeld.Höhe And Xort2 < Objektverwalter.Spielfeld.Breite Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Sichtbar = True Then
                                    If Not Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Xort2, YOrt, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler).Team = Objektverwalter.Spielfeld.AktuellerSpieler.Team Then
                                        Objektverwalter.neuMarkiertesFeld(Xort2, YOrt, Color.FromArgb(160, 255, 255, 255), "Rot")
                                    End If
                                End If
                            End If
                        End If
                        XOrt += 1
                    Next
                    X += 2
                    XOrt = 0
                    XOrt = XOrt - (X - 1) / 2
                Next
        End Select
    End Sub
    Protected Sub StrahlFeuer()
        BackbufferSpiel.AddAnimation("LASERSTRAHL", 0, New Point(Rechteck.X, Rechteck.Y), True, Schlacht)
        For I As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X - I
            Dim Y As Integer = Rechteck.Y
            DoDamage(X, Y)
        Next
        'Nach links markieren
        For I2 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X + I2
            Dim Y As Integer = Rechteck.Y
            DoDamage(X, Y)
        Next
        'Nach oben markieren
        For I3 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y - I3
            DoDamage(X, Y)
        Next
        'Nach unten markiern
        For I4 As Integer = 1 To Reichweite + 1
            Dim X As Integer = Rechteck.X
            Dim Y As Integer = Rechteck.Y + I4
            DoDamage(X, Y)
        Next
        'Jetzt müsste die Animation abgespielt werden

    End Sub

    Protected Sub KreisFeuer()
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) > 0 Then
                    Heilung(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y)
                End If
            Next
        Next
    End Sub
    Protected Sub KugelFeuer()
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X = 0 To Kreis.GetLength(0) - 1
            For Y = 0 To Kreis.GetLength(1) - 1
                If Kreis(X, Y) >= 0 Then
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, ObjektSpielfeld.Bodenschlacht)
                    If IsNothing(E) = False Then
                        If E.GetSpieler.Team <> Me.GetSpieler.Team Then
                            DoDamage(Rechteck.X - Reichweite + X, Rechteck.Y - Reichweite + Y, ObjektSpielfeld.Bodenschlacht)
                        End If
                    End If
                End If
            Next
        Next
    End Sub

    ''' <summary>
    ''' Fügt der Einheit Schaden Zu
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub Heilung(ByVal X As Integer, ByVal Y As Integer)
        If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                If Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Spieler = Spieler Then
                    Dim KP As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getKP - Schaden
                    If KP <= 0 Then
                        Objektverwalter.NeuObjektAnimation(X, Y)
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                    Else
                        If KP > 10 Then
                            KP = 10
                        End If
                        Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben = KP * 10
                        If Schaden < 0 Then
                            Objektverwalter.Ration(X, Y, False, 4, Schlacht)
                        End If
                    End If
                End If
            End If
        End If
    End Sub
    Public Sub SiloZünden(ByVal X As Integer, ByVal Y As Integer)
        If Angriff = Angriffe.Silo Or Angriff = Angriffe.Rakete Then
            Dim Kreis(,) As Integer = {}
            Select Case Reichweite
                Case 2
                    Kreis = Kreisfunktion(Reichweite)
                    Objektverwalter.NeuObjektAnimation(New Point(X, Y), "Explosion+Siloklein", Objektverwalter.Spielfeld.MomentaneSchlacht)
            End Select
            For X1 = 0 To Kreis.GetLength(0) - 1
                For Y1 = 0 To Kreis.GetLength(1) - 1
                    If Kreis(X1, Y1) >= 0 Then
                        If X - Reichweite + X1 >= 0 And X - Reichweite + X1 < Objektverwalter.Spielfeld.Breite And Y - Reichweite + Y1 >= 0 And Y - Reichweite + Y1 < Objektverwalter.Spielfeld.Breite Then
                            DoDamage(X - Reichweite + X1, Y - Reichweite + Y1)
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    Public Sub DoDamage(ByVal X As Integer, ByVal Y As Integer)
        If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht)) = False Then
                Dim KP As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).getKP - Schaden
                If KP <= 0 Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                    Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht) = Nothing
                Else
                    If KP > 10 Then
                        KP = 10
                    End If
                    Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Leben = KP * 10
                    If Schaden < 0 Then
                        Objektverwalter.Ration(X, Y, False, 0, Objektverwalter.Spielfeld.MomentaneSchlacht)
                    End If
                End If
            End If
        End If
    End Sub
    Public Sub DoDamage(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer)
        If X >= 0 And Y >= 0 And X < Objektverwalter.Spielfeld.Breite And Y < Objektverwalter.Spielfeld.Höhe Then
            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                Dim KP As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).getKP - Schaden
                If KP <= 0 Then
                    Objektverwalter.NeuObjektAnimation(X, Y)
                    Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht) = Nothing
                Else
                    If KP > 10 Then
                        KP = 10
                    End If
                    Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Leben = KP * 10
                    If Schaden < 0 Then
                        Objektverwalter.Ration(X, Y, False, 0, Schlacht)
                    End If
                End If
            End If
        End If
    End Sub
    Public Function GetRealGebäudeID() As String
        Return GebäudeIDD
    End Function
    Protected Sub GenerateNetzBefehlGebäudeFeuer(ByVal X As Integer, ByVal Y As Integer)

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Schuss
            Befehl.KooX = Rechteck.X
            Befehl.KooY = Rechteck.Y
            Befehl.WegX = New Integer() {Rechteck.X}
            Befehl.WegY = New Integer() {Rechteck.Y}
            Befehl.OpferX = X
            Befehl.OpferY = Y
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

    End Sub
    Public Function GetSpieler() As ObjektSpieler
        Return Objektverwalter.Spielfeld.Spieler(Spieler)
    End Function
    Public Overridable Function GetMaxLeben() As Integer
        Return 0
    End Function

#End Region

    ''' <summary>
    ''' Klont das gesamte Gebäude
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim G As ObjektGebäude = MemberwiseClone()
        ReDim G.Variablen(Variablen.Length - 1)
        For I = 0 To Variablen.Length - 1
            G.Variablen(I) = Variablen(I).Clone
        Next
        ReDim G.Verweisgebäude(Verweisgebäude.GetLength(0) - 1, Verweisgebäude.GetLength(1) - 1)
        For X = 0 To Verweisgebäude.GetLength(0) - 1
            For Y = 0 To Verweisgebäude.GetLength(1) - 1
                G.Verweisgebäude(X, Y) = Verweisgebäude(X, Y)
            Next
        Next
        G.RotationsZenturm = New Point(RotationsZenturm.X, RotationsZenturm.Y)
        G.Rechteck = New Rectangle(Rechteck.X, Rechteck.Y, Rechteck.Width, Rechteck.Height)

        Return G
    End Function
    ''' <summary>
    ''' Gibt alle Einheiten zurück die Seeeinheiten sind und Waffen haben und hier gebaut werden können!
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetSeaUnits(ByVal Prüffonds As Integer) As ObjektEinheit()
        Dim E As New Stack(Of ObjektEinheit)
        Dim L As String() = GetBauliste(Spieler)
        Dim S As ObjektSpieler = GetSpieler()
        For Each E1 In L
            Dim E2 As ObjektEinheit = ObjektLadeklasse.NewEinheit(E1, Spieler, Rechteck.X, Rechteck.Y)
            If E2.IsSeaUnit Then
                If E2.CanAttack Then
                    If E2.Kosten * S.Teurungsrate(E2, Rechteck.X, Rechteck.Y) <= Prüffonds Then
                        E.Push(E2)
                    End If
                End If
            End If
        Next
        Return E.ToArray
    End Function
    ''' <summary>
    ''' Gibt alle Einheiten zurück die Bodeneinheiten sind und Waffen haben und hier gebaut werden können!
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetGroundUnits(ByVal Prüffonds As Integer) As ObjektEinheit()
        Dim E As New Stack(Of ObjektEinheit)
        Dim L As String() = GetBauliste(Spieler)
        Dim S As ObjektSpieler = GetSpieler()
        For Each E1 In L
            Dim E2 As ObjektEinheit = ObjektLadeklasse.NewEinheit(E1, Spieler, Rechteck.X, Rechteck.Y)
            If E2.IsGroundUnit Then
                If E2.CanAttack Then
                    If E2.Kosten * S.Teurungsrate(E2, Rechteck.X, Rechteck.Y) <= Prüffonds Then
                        E.Push(E2)
                    End If
                End If
            End If
        Next
        Return E.ToArray
    End Function
    ''' <summary>
    ''' Gibt alle Einheiten zurück die Lufteinheiten sind und Waffen haben und hier gebaut werden können!
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetAirUnits(ByVal Prüffonds As Integer) As ObjektEinheit()
        Dim E As New Stack(Of ObjektEinheit)
        Dim L As String() = GetBauliste(Spieler)
        Dim S As ObjektSpieler = GetSpieler()
        For Each E1 In L
            Dim E2 As ObjektEinheit = ObjektLadeklasse.NewEinheit(E1, Spieler, Rechteck.X, Rechteck.Y)
            If E2.IsFlyingUnit Then
                If E2.CanAttack Then
                    If E2.Kosten * S.Teurungsrate(E2, Rechteck.X, Rechteck.Y) <= Prüffonds Then
                        E.Push(E2)
                    End If
                End If
            End If
        Next
        Return E.ToArray
    End Function
End Class
